home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / misc / zvm1_25.lha / handlefax.zvm < prev    next >
Text File  |  1993-09-27  |  14KB  |  502 lines

  1. /*handlefax.zvm*/
  2. /* DANGER!!! DO NOT EDIT ANYTHING THAT IS NOT PART OF THE USER-CODE SECTION!!! */
  3.  
  4. /* THIS PART IS INCLUDED FROM INCLUDEH.ZVM.  DO NOT EDIT THIS PART.  LOOK FOR
  5.    THE SECTION WHICH SAYS USER CODE SECTION.  YOU HAVE BEEN WARNED!
  6.     
  7.    V1.00
  8. */
  9.  
  10. /* we want results! */
  11. options results
  12.  
  13. /* We want to trap on these things, to help us debug.  The definitions for
  14.    these are in INLCUDET.ZVM
  15. */
  16.  
  17. signal on halt
  18. signal on novalue
  19. signal on syntax
  20. signal on break_c
  21.  
  22. /* Set up modem stuff */
  23. call doInitializations
  24.  
  25. /* We are about to start the user code section.  Any function that you
  26.    write that has a PROCEDURE statement NEEDS to have an EXPOSE MODE. STATUS.
  27.    for my stub functions to work.
  28. */
  29. /*vvvvvvvvvvvvvvvvvvvvvvvvBEGINNING OF USER CODEvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  30.  
  31. options failat 50
  32.  
  33. call atCommands()
  34. call use19200()
  35. address rexx_gpfax 'listen'
  36. address rexx_gpfax 'recfax'
  37. faxResult = rc
  38. address rexx_gpfax 'unlisten'
  39.  
  40. handle = addLogEntry(0)
  41. call setLogEntryVariable('CIDNAME', 0, handle, currentCIDName())
  42. call setLogEntryVariable('CIDNUMBER', 0, handle, currentCIDNumber())
  43.     
  44.  
  45. if faxResult <= 5 then do /* warn or no-error */
  46.     /* add it to our log book */
  47.  
  48.     address rexx_gpfax 'reportlog' 1
  49.     call setLogEntryVariable('FILENAME', 0, handle, result)
  50.  
  51.     address rexx_gpfax 'reportlog' 6
  52.     call setLogEntryVariable('LENGTH', 0, handle, result)
  53.  
  54.     address rexx_gpfax 'reportlog' 2
  55.     call setLogEntryVariable('COMMENT', 0, handle, result 'page(s) received.')
  56.  
  57.     address rexx_gpfax 'reportlog' 4
  58.     call setLogEntryVariable('RETURNNUMBER', 0, handle, result)
  59.  
  60.     call setLogEntryVariable('TYPE', 0, handle, 'f') /* fax file */
  61. end; else do
  62.     call setLogEntryVariable('COMMENT', 0, handle, 'Fax attempted.')
  63.     call setLogEntryVariable('TYPE', 0, handle, '?')
  64. end
  65.  
  66. exit
  67.  
  68. /*^^^^^^^^^^^^^^^^^^^^^^^^^^END OF USER CODE^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  69. /*-------------------------------HANDS OFF--------------------------------*/
  70. /* DON'T TOUCH THIS STUFF.  IF YOU FIX SOMETHING HERE, TELL ME ABOUT IT   */
  71. /* 
  72.     HISTORY
  73.  
  74.     V1.32    - Added getoption, readoptions, setserial
  75.     V1.31    - Fixed debugger stuff (no value)
  76.     V1.30    - Added debugger stuff
  77.     V1.29    - Fixed type. and log. problem not being exposed
  78.         - Fixed filetype function
  79.     V1.28    - Fixed a problem in callup.  Maybe related to 5.02 roms
  80.     V1.27    - Added filetype rexx function to determine the type
  81.         of a file
  82.     V1.26   - Added some more rexx functions to interface with ZVM
  83.         - Added the callup function to dial a telephone number
  84.     V1.25     - Fixed getnumvoicemessages
  85.     V1.24    - Added requiremode, assumemode, etc.
  86.     V1.23    - Changed the way type and status are handled and added
  87.         a new argument to the get and set stuff (namely, the log number)
  88.         - Also changed to setLogEntryVariable and getLogEntryVariable
  89.         instead of the numerous functions we had before
  90.     V1.22 - Added stuff to make it more programmable
  91. */
  92.  
  93. exit
  94.  
  95. getOption: procedure expose options.
  96.     parse upper arg optionName
  97.     return options.optionName
  98.  
  99. readOptions: procedure expose options.
  100.     firstLine = sourceline(1)
  101.     parse var firstLine '/*' title '.'
  102.     optionsFileName = title || '.options'
  103.     if exists(optionsFileName) then do
  104.         call open('options', optionsFileName, 'r')
  105.         do while ~eof('options')
  106.             line = readln('options')
  107.             parse upper var line variable '=' value
  108.             options.variable = value
  109.         end
  110.         call close('options')
  111.     end
  112.  
  113.     return
  114.  
  115. /* this function dials a number and returns status.normal
  116.     if someone picks up the phone that was called.  It returns
  117.     other types of errors otherwise.
  118. */
  119.  
  120. callup: procedure expose status. mode. device.
  121.     parse arg telephoneNumber
  122.     
  123.     /* should do an at+fclass=8 */
  124.     status = requireMode(mode.voiceMode)
  125.     if status ~= status.normal then return status
  126.  
  127.     status = writeLine('ATD' telephoneNumber)
  128.     if status ~= status.normal then return status
  129.  
  130.     /* this should swallow the thing we just sent out */
  131.     status = readLine(60) /* 60 second timeout */
  132.     if status ~= status.normal then return status
  133.  
  134. ringing:
  135.     status = readLine(60) /* 60 second timeout */
  136.     if status ~= status.normal then return status
  137.  
  138.     /* line should have the line we want */
  139.     if line = 'VCON' then do
  140.         /* removed the next line because even though we received
  141.             a VCON, it doesn't go into voicemode */
  142.         call requireDevice(device.telephoneLine)
  143.         /*
  144.         call assumeMode(mode.connectedMode)
  145.         */
  146.         return status.normal
  147.     end
  148.  
  149.     if line = 'RINGING' then signal ringing
  150.     if line = 'NO CARRIER' then return status.busydetected
  151.     if line = '' then signal ringing
  152.     if line = 'NO DIALTONE' then do
  153.         call showDebugger("I couldn't detect the dialtone")
  154.         return status.busydetected
  155.     end
  156.  
  157.     return status.busyDetected
  158.  
  159. /* This function gives you a simple way of presenting an N key menu
  160.     to the caller
  161.  
  162.     ARGS:  numKeys choiceFileName badChoiceFileName timeOut validChoices
  163.     numBadChoices
  164.  
  165.     numKeys = number of keys wanted
  166.     choiceFileName = file name of the menu
  167.     badChoiceFileName = what to say if caller enters a bad choice
  168.     timeOut = number of seconds allowed before timing out
  169.     validChoices = list of characters that are valid choices
  170.     numBadChoices = number of times you want to present the menu before exiting
  171.  
  172.     RETURNS:  status, choice = valid key
  173. */
  174.  
  175. presentMenu: procedure expose choice status. mode.
  176.     parse arg numKeys,choiceFileName,badChoiceFileName,timeOut,validChoices,numBadChoices .
  177.  
  178.     timesAround = numBadChoices;
  179.  
  180.     do timesAround = numBadChoices to 1 by -1
  181.         status = playVoice(choiceFileName)
  182.  
  183.         if status > status.keyDetected then signal presentMenuDone;
  184.  
  185.         status = readNKeys(numKeys, timeOut)
  186.  
  187.         if status = status.timedOut then do
  188.             call flushPhoneBuffer()
  189.             status = playVoice('voice:voices/Timed Out')
  190.             iterate
  191.         end
  192.         if status ~= status.normal then signal presentMenuDone;
  193.  
  194.         choice = keys
  195.         if pos(choice, validChoices) = 0 then do
  196.             call flushPhoneBuffer()
  197.             status = playVoice(badChoiceFileName)
  198.             iterate
  199.         end
  200.  
  201.         return status.normal
  202.     end
  203.  
  204.     status = status.timedOut
  205. presentMenuDone:
  206.     return status
  207.  
  208. /*----------------------------------------------------------------------*/
  209. /*    Here are the encapsulated functions.  They're responsible for
  210.     communicating with ZVM.  Don't edit or touch them, except for
  211.     bug fixes.
  212. */
  213.  
  214. playVoice:  procedure expose status. mode.
  215.     parse arg fileName
  216.     address voicemail1 'playVoice' fileName
  217.     if rc >= status.busyDetected then
  218.         call showDebugger('playVoice' rc)
  219.     return rc
  220.  
  221. /* this returns a handle to the newly created log entry */
  222. addLogEntry: procedure expose status. mode.
  223.     if arg() ~= 1 then do
  224.         say 'Bad arguments to addLogEntry'
  225.         return 20
  226.     end
  227.     parse arg logNumber
  228.     address voicemail1 'addLogEntry' logNumber
  229.     return result
  230.  
  231. setLogEntryVariable: procedure expose status. mode.
  232.     if arg() ~= 4 then do
  233.         say 'Bad arguments to setLogEntryVariable'
  234.         return 20
  235.     end
  236.     parse arg variable, logNumber, logEntryNumber, logEntryValue
  237.     address voicemail1 'setLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber || ',' || logEntryValue
  238.     return rc
  239.  
  240. getLogEntryVariable: procedure expose status. mode.
  241.     if arg() ~= 3 then do
  242.         say 'Bad arguments to getLogEntryVariable'
  243.         return 'BADBADBAD'
  244.     end
  245.     parse arg variable, logNumber, logEntryNumber
  246.     address voicemail1 'getLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber
  247.     return result
  248.  
  249. getNumVoiceMessages: procedure expose status. mode.
  250.     if arg() ~= 1 then do
  251.         say 'Bad arguments to getNumVoiceMessages'
  252.         return 'BADBADBAD'
  253.     end
  254.     parse arg logNumber
  255.     address voicemail1 'getNumVoiceMessages' logNumber
  256.     return result
  257.  
  258. recordVoice:  procedure expose status. mode.
  259.     parse arg fileName
  260.     address voicemail1 'recordVoice' fileName
  261.     return rc
  262.  
  263. password: procedure expose status. mode.
  264.     address voicemail1 'password'
  265.     return result
  266.  
  267. hasFax: procedure expose status. mode.
  268.     address voicemail1 'hasfax'
  269.     return result
  270.  
  271. playBeep:  procedure expose status. mode.
  272.     parse arg tone1, tone2, duration
  273.     address voicemail1 'playBeep' tone1 ',' tone2 ',' duration
  274.     return rc
  275.  
  276. readNKeys:  procedure expose status. keys mode.
  277.     parse arg numKeys, timeOut
  278.     address voicemail1 'readNKeys' numKeys ',' timeOut
  279.     if rc = status.normal then keys = result
  280.     return rc
  281.  
  282. read1Key:  procedure expose status. key mode.
  283.     parse arg timeOut
  284.     address voicemail1 'read1Key' timeOut
  285.     if rc = status.normal then key = result
  286.     return rc
  287.  
  288. readKeysUntil: procedure expose status. keys mode.
  289.     parse arg terminatingCharacter, maxCharacters, timeOut
  290.     address voicemail1 'readKeysUntil' terminatingCharacter ',' maxCharacters ',' timeOut
  291.     if rc = status.normal then keys = result
  292.     return rc
  293.  
  294. readLine: procedure expose status. line mode.
  295.     parse arg timeOut
  296.     address voicemail1 'readLine' timeOut
  297.     if rc = status.normal then line = result
  298.     return rc
  299.  
  300. quickATCommand: procedure expose status. mode.
  301.     parse arg command, timeout, errorLine
  302.     if arg(2, 'o') then timeout = 5
  303.     if arg(3, 'o') then errorLine = 'ERROR'
  304.  
  305.     rc = writeLine(command)
  306.     if rc ~= status.normal then return rc
  307.     rc = readLine(timeout)
  308.     if rc ~= status.normal then return rc
  309.     rc = readLine(timeout)
  310.     if line = errorLine then return status.error
  311.     return rc
  312.  
  313. writeLine: procedure expose status. mode.
  314.     parse arg line
  315.     address voicemail1 'writeLine' line
  316.     return rc
  317.  
  318. /* the 'assumeUnknownMode' is to make sure that any use of a voice command WILL
  319.     cause ZVM to hang up the line, reset the modem, then do its stuff */
  320.  
  321. dropLine: procedure expose status. mode.
  322.     address voicemail1 'requireMode' mode.commandMode
  323.     address voicemail1 'assumeUnknownMode'
  324.     return rc
  325.  
  326. atCommands: procedure expose status. mode.
  327.     address voicemail1 'requireMode' mode.connectedMode
  328.     address voicemail1 'assumeUnknownMode'
  329.     return rc
  330.  
  331. requireDevice: procedure expose status. mode.
  332.     parse arg device
  333.     address voicemail1 'requireDevice' device
  334.     return rc
  335.  
  336. requireCompression: procedure expose status. compression.
  337.     parse arg compression
  338.     address voicemail1 'requireCompression' compression
  339.     return rc
  340.  
  341. requireMode: procedure expose status. mode.
  342.     parse arg mode
  343.     address voicemail1 'requireMode' mode
  344.     return rc
  345.  
  346. assumeMode: procedure expose status. mode.
  347.     parse arg mode
  348.     address voicemail1 'assumeMode' mode
  349.     return rc
  350.  
  351. assumeUnknownMode: procedure expose status. mode.
  352.     address voicemail1 'assumeUnknownMode'
  353.     return rc
  354.  
  355. distinctiveRing: procedure expose status. mode.
  356.     address voicemail1 'distinctiveRing'
  357.     return result
  358.  
  359. currentCIDName: procedure expose status. mode.
  360.     address voicemail1 'currentCIDName'
  361.     return result
  362.  
  363. currentCIDNumber: procedure expose status. mode.
  364.     address voicemail1 'currentCIDNumber'
  365.     return result
  366.  
  367. fileType: procedure expose status. mode.
  368.     parse arg filename
  369.     address voicemail1 'filetype' filename
  370.     return result
  371.  
  372. /* handshaking = 1 if you want 7 wire handshaking, handshaking = 2 if you
  373.     want xon/xoff handshaking */
  374. changeSerialParameters: procedure expose status. mode.
  375.     parse arg bps, bits, stop, handshaking
  376.     address voicemail1 'setserial' bps ',' bits ',' stop ',' handshaking
  377.     return rc
  378.  
  379. /* this is mainly for fax mode */
  380. use19200: procedure expose status. mode.
  381.     call changeSerialParameters(19200, 8, 1, 1)
  382.     address voicemail1 'assumeUnknownMode'
  383.     return rc
  384.  
  385. flushPhoneBuffer:  procedure expose status. mode.
  386.     address voicemail1 'flushPhoneBuffer'
  387.     return status.normal
  388.  
  389. listen: procedure expose status. mode.
  390.     address voicemail1 'listen'
  391.     return status.normal
  392.  
  393. answerFax: procedure expose status. mode.
  394.     address rexx 'handleFax'
  395.     return rc
  396.  
  397. cTime: procedure expose status. now mode.
  398.     address voicemail1 'ctime'
  399.     return result
  400.  
  401. displayError: procedure expose status. mode.
  402.     parse arg error
  403.     address voicemail1 'displayError' error
  404.     return status.normal
  405.  
  406. displayStatus: procedure expose status. mode.
  407.     parse arg status
  408.     address voicemail1 'displayStatus' status
  409.     return status.normal
  410.  
  411. displayMessage: procedure expose status. mode.
  412.     parse arg message
  413.     address voicemail1 'displayMessage' message
  414.     return status.normal
  415.  
  416. /* Effectively unlistens also! */
  417. setLastError: procedure expose status. mode.
  418.     parse arg status, error
  419.     address voicemail1 'setLastError' status ',' error
  420.     return status.normal
  421.  
  422. showDebugger: procedure
  423.     parse arg debuggerInfo
  424.     
  425.     firstLine = sourceline(1)
  426.     parse var firstLine '/*' title '*/'
  427.     if showlist('p', 'DEBUGGERLOGGER1') then
  428.         address debuggerLogger1 'e' title ':' debuggerInfo
  429.     else
  430.         say title ':' debuggerInfo
  431.     return
  432.  
  433. /*-----------------------------------------------------------------------*/
  434. /*                         signal processing                             */
  435. error:
  436.     call showDebugger("Error" rc "at line" sigl)
  437.     exit 20
  438.  
  439. break_c:
  440. halt:
  441.     call showDebugger("Halt/Break_C at line" sigl)
  442.     exit 20
  443.  
  444.  
  445. novalue:
  446.     call showDebugger("No value at line" sigl)
  447.     exit 20
  448.  
  449. syntax:
  450.     call showDebugger("Syntax error" rc "at line" sigl)
  451.     exit 20
  452.  
  453.  
  454. /* Initialize everything needed to communicate correctly with ZVM */
  455. doInitializations: procedure expose compression. mode. status. device. type. log.
  456.  
  457. log.incomingLog = 0
  458. log.archiveLog = 1
  459. log.outgoingLog = 2
  460. log.outgoingArchiveLog = 3
  461.  
  462. /* compressions */
  463. compression.ADPCM2 = 2
  464. compression.ADPCM3 = 3
  465. compression.CELP = 1
  466.  
  467. /* devices */
  468. device.telephoneLine = 2
  469. device.externalMic = 8
  470. device.internalSpeaker = 16
  471.  
  472. /* file types */
  473. type.unknownFile = 0
  474. type.zvmRawFile = 1
  475. type.zyxelFile = 2
  476. type.iffFaxFile = 3
  477. type.iff8svxFile = 4
  478.  
  479. /* modem modes */
  480. mode.unknownMode = -1
  481. mode.commandMode = 0
  482. mode.voiceMode = 1
  483. mode.connectedMode = 2
  484. mode.playMode = 3
  485. mode.recordMode = 4
  486.  
  487. /* return statuses from the various commands */
  488. status.normal = 0
  489. status.keyDetected = 1
  490. status.quietDetected = 2
  491. status.silenceDetected = 3
  492. status.faxDetected = 4
  493. status.busyDetected = 5
  494. status.timedOut = 6
  495. status.signalDetected = 7
  496. status.overflow = 8
  497. status.error = 9
  498.  
  499. call addlib("rexxsupport.library", 0, -30, 0)
  500.  
  501. return
  502.